package cz.possoft.client.piskvorky.gui.panel;

import java.util.Date;

import cz.possoft.client.gui.dialog.SimpleDialog;
import cz.possoft.client.gui.panel.GamePanel;
import cz.possoft.client.gui.panel.nastavenispodnipanel.panel.NastaveniShowPanel;
import cz.possoft.client.piskvorky.gui.components.PiskvorkyPane;
import cz.possoft.client.piskvorky.gui.components.PiskvorkyThread;
import cz.possoft.client.utils.PanelHolderUtils;
import cz.possoft.generic.utils.GenericUtils;
import cz.possoft.messages.PropertiesManager;
import cz.possoft.messages.Text;
import cz.possoft.serializable.generic.Game;
import cz.possoft.serializable.generic.Location;
import cz.possoft.serializable.piskvorky.game.PiskvorkyGame;
import cz.possoft.serializable.piskvorky.game.PiskvorkyPole;

/**
  * Hraci panel pro hru piskvorky 
  *  
  * @author mara
  */
public class PiskvorkyPanel extends GamePanel {
	
	// pomocna promenna pri vykreslovani piskvorek.
	// Je dulezita proto, aby se pole neprekreslovalo pri kazdem
	// pohybu mysi
	private PiskvorkyThread piskvorkyThread;
	
	   /** Creates a new instance of PiskvorkyPanel */
    public PiskvorkyPanel() {    	
    }
    
    // inicializuje komponenty, ktere by mely byt specificke pro tuto hru.    
    protected void initComponents() {
    	super.initComponents();
    }  
    
    // Tato metoda zavola setGame a pote provede nezbytne inicialni
    // kroky pri nasetovani teto hry (prekresleni panelu atd.)    
    public void setAndInitGame(Game gam) {    
    	super.setAndInitGame(gam);    	
        PiskvorkyGame game = (PiskvorkyGame)gam;         
        if (game.isMeWhite()) {        	      	
        	getClientNameLabel().setText(addHtmlTagsToLabels(game.getWhitePlayerName(), "RED", '5'));    
        	getOpponentNameLabel().setText(addHtmlTagsToLabels(game.getBlackPlayerName(), "#aaaa00", '5')); 
        }
        if (!game.isMeWhite()) {        	
        	getOpponentNameLabel().setText(addHtmlTagsToLabels(game.getWhitePlayerName(), "RED", '5'));   
        	getClientNameLabel().setText(addHtmlTagsToLabels(game.getBlackPlayerName(), "#aaaa00", '5')); 
        }  
        getLastTahLabel().setVisible(false);        
        getGamePane().setHraciPole(game.getHraciPole());    	
    }
    
    // nastavi active u hry a provede pridruzene akce
    public void setActiveToGame(boolean active) {
        super.setActiveToGame(active);
        if (active) {
        	piskvorkyThread = new PiskvorkyThread((PiskvorkyPane)getGamePane());
        }
        else {
        	if (piskvorkyThread != null) {
        	    piskvorkyThread.setEndFlag(true);
        	}
        }
    }        
    
    // Odehrani tahu. Smysl maji jen oldX a oldY.
    // newX je identifikace barvy. newY se nepouziva a melo by byt pro tuto hru vzdy 0.
    public void doPlay(int oldX, int oldY, int newX, int newY) {    
    	super.doPlay(oldX, oldY, newX, newY);
    	((PiskvorkyPole)getGamePane().getHraciPole()).getFigurka(oldX, oldY).setColor(newX);
    	((PiskvorkyPane)(getGamePane())).startMalovani(oldX, oldY, newX);
    	controlGameEnd();    	
    	getGamePane().repaint();    	
    }
    
    // Pro hrace ktery je na tahu je oznaceno misto, kam muze tahnout (hodit balonek)
    // Oznacuje se vzdycky aktualni sloupec
    public void updateForPlaceWhereIsMouse(Location location) {
    	if (location.isNull()) {
    		((PiskvorkyPane)getGamePane()).getRingFigurkaLocation().setNull();    		
    	}
       	// kontrola jestli se zde nenachazi uz kolecko nebo krizek    	
    	else if (((PiskvorkyPole)(getGame().getHraciPole())).getFigurka(location.getX(), location.getY()).getColor() != GenericUtils.COLOR_NEUTRAL) {
    		((PiskvorkyPane)getGamePane()).getRingFigurkaLocation().setNull();    	
    	}    	
    	else {
    	((PiskvorkyPane)getGamePane()).getRingFigurkaLocation().setX(location.getX());
    	((PiskvorkyPane)getGamePane()).getRingFigurkaLocation().setY(location.getY());         
    	} 
    	piskvorkyThread.setRepaintFlag(true);
    }
    
    // odehraje tah pro danou location. Location je vzdy
    // horni misto na sachovnici, takze tato metoda jeste musi zjistit
    // misto, kam balonek spadne.
    public void play(Location location) {
    	if (location.isNull()) {
    		return;
    	}
    	// navrat pro misto, kde se uz nachazi krizek nebo kolecko
    	if (((PiskvorkyPole)(getGame().getHraciPole())).getFigurka(location.getX(), location.getY()).getColor() != GenericUtils.COLOR_NEUTRAL) {
    		return;
    	}        	
    	PiskvorkyPane sachovnice = (PiskvorkyPane)getGamePane();
       	int color = getGame().isMeWhite() ? GenericUtils.COLOR_WHITE : GenericUtils.COLOR_BLACK;
    	NastaveniShowPanel.getConnectThread().sendToServer("PLAY: _" + location.getX() + "_" + location.getY() + "_" + color + "_0");
    	sachovnice.getRingFigurkaLocation().setNull();    	   
    	doPlay(location.getX(), location.getY(), color, 0);    	    	
    }
    
    // zkontroluje jestli je hra v koncovem stavu.
    // tzn. jestli jsou nekde 5 v rade. Pokud jo, tak provede
    // prislusne ukoncujici akce
    private void controlGameEnd() {
    	int flag = (((PiskvorkyPole)(getGame().getHraciPole())).controlGameEnd());
    	// pripad kdy je hra ukoncena
    	if (flag != GenericUtils.COLOR_NEUTRAL) {
           	PanelHolderUtils.getCurrentGamePanel().setActiveToGame(false);
        	PanelHolderUtils.getCurrentGamePanel().setEndStateToGame(true);
        	if (((getGame().isMeWhite()) && (flag == GenericUtils.COLOR_WHITE)) || ((!getGame().isMeWhite()) && (flag == GenericUtils.COLOR_BLACK))) {
                SimpleDialog.getInstance(PropertiesManager.getInstance().getMessageForKey(Text.VYHRA), Text.getPiskvorkyMessage("5", true));    		
        	}
        	else {
        		SimpleDialog.getInstance(PropertiesManager.getInstance().getMessageForKey(Text.PROHRA), Text.getPiskvorkyMessage("5", false));  
        	}
    	}    	
    }    

}
